package com.rc.evcharger.common.base;

import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;

import java.util.List;

/**
 * Created by sven on 2019/6/24
 */
public interface BaseMongoDao<T extends BaseMongoEntity> {
    /**
     * 新增
     * @Document(collection = "cl_charge_process_log")，如果collection不存在，会自动创建
     * @param entity
     */
    //void insert(T entity);

    void insert(T entity, String collectionName);

    /**
     * 新增
     * @Document(collection = "cl_charge_process_log")，如果collection不存在，会自动创建
     * @param entity
     */
    void save(T entity, String collectionName);

    /**
     * 按条件更新
     * @param query
     * @param update
     */
    void update(Query query, Update update, String collectionName);

    /**
     * 根据Query查询条件删除
     * @param query
     */
    void delete(Query query, String collectionName);

    /**
     * 根据_ID查找
     * @param id
     * @return
     */
    T findById(String id, String collectionName);

    /**
     * 只查询符合条件的第一条数据
     * @param query
     * @return
     */
    T findOne(Query query, String collectionName);

    /**
     * 按条件查询
     * @param query
     * @return
     */
    List<T> find(Query query, String collectionName);

    /**
     * 按条件查找并排序
     * @param query
     * @param sort
     * @return
     */
    List<T> find(Query query, Sort sort, String collectionName);

    /**
     * 按条件分页查找并排序
     * @param query
     * @param sort
     * @return
     */
    PageImpl<T> findPage(Query query, Sort sort, int pageIndex, int pageSize, String collectionName);

    /**
     * 返回全部记录并排序,慎用，不需条件
     * @param sort
     * @return
     */
    List<T> findAll(Sort sort, String collectionName);

    /**
     * 按条件统计
     * @param query
     * @return
     */
    Long count(Query query, String collectionName);

    //List<T> findByProp(String propName, Object value);
    //
    //List<T> findByProp(String propName, Object value, String order);
    //
    //List<T> findByProps(String[] propName, Object[] values);
    //
    //List<T> findByProps(String[] propName, Object[] values, String order);
    //
    //T uniqueByProp(String propName, Object value);
    //
    //T uniqueByProps(String[] propName, Object[] values);

    //int countByCondition(String[] params, Object[] values);
}